create or replace 
PACKAGE BODY         "PKG_HECO_GLOBAL" IS  
PROCEDURE SP_LISTAR_PARAMS_TABLA (
  pIdTabla  IN  HECO_PARAMETRODETALLE.idtabla%TYPE,
  oListado OUT TIPOCURSOR
) IS
BEGIN
     OPEN oListado FOR
     SELECT idparametro,INITCAP(nombre) as nombre,valornumber,valorchar,valorvarchar1,valorvarchar2 
     FROM  HECO_PARAMETRODETALLE where idtabla = pIdTabla and ESTADO =1;
END SP_LISTAR_PARAMS_TABLA;
--TipoSubtipo--
PROCEDURE SP_LISTAR_SUBTIPO_BY_TIPO (
  pIdTipo  IN heco_tiposubtipo.p05tipo%TYPE,
  oListado OUT TIPOCURSOR
) IS 
BEGIN
     OPEN oListado FOR
     SELECT ts.p05tipo,ts.p06subtipo, INITCAP(pd.Nombre) as p06subtipoDesc FROM heco_tiposubtipo ts 
     left join  HECO_PARAMETRODETALLE pd on pd.idparametro = ts.p06subtipo  
     where ts.p05tipo = pIdTipo and pd.ESTADO = 1;
END SP_LISTAR_SUBTIPO_BY_TIPO;
-- Componentes --
-- Insert --
PROCEDURE SP_INSERTAR_COMPONENTE (PNOMBRE IN VARCHAR2, PP01UNIDAD IN NUMBER, PDESCRIPCION IN VARCHAR2, PNOMBRECORTO IN VARCHAR2, 
PCODIGO IN CHAR, PP07CLASE IN NUMBER, PTIEMPOVIDAANIO IN NUMBER,PUSUCRE IN VARCHAR2,PIPREG IN VARCHAR2,PCAPACIDAD IN VARCHAR2,
PINFOPUBLICA IN CHAR,PIDCOMP OUT NUMBER)
AS
id NUMBER;
BEGIN
 SELECT SEQ_HECO_COMPONENTE.NEXTVAL
    INTO id
    FROM DUAL;
    
  INSERT INTO HECO_COMPONENTE (IDCOMPONENTE, NOMBRE, P01UNIDAD, DESCRIPCION, NOMBRECORTO, 
CODIGO, P07CLASE, TIEMPOVIDAANIO, ESTADO,FECCRE,FECMOD,USUCRE,USUMOD,IPREG,IPMOD,CAPACIDAD,INFOPUBLICA) 
VALUES (id, PNOMBRE, PP01UNIDAD, PDESCRIPCION, PNOMBRECORTO, 
PCODIGO, PP07CLASE, PTIEMPOVIDAANIO,'1',SYSDATE,SYSDATE,PUSUCRE,PUSUCRE,PIPREG,PIPREG,PCAPACIDAD,PINFOPUBLICA);

PIDCOMP := id;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      PIDCOMP := -1;      
END SP_INSERTAR_COMPONENTE;

PROCEDURE SP_INSERTAR_COMPONENTETIPO 
(PP05TIPO IN NUMBER,PUSUCRE IN VARCHAR2,PIPREG IN VARCHAR2,PIDCOMP IN NUMBER)
AS
BEGIN
  INSERT INTO heco_componentetipo (IDCOMPONENTE, P05TIPO,ESTADO,IPREG,IPMOD,USUCRE,FECCRE,USUMOD,FECMOD) 
VALUES (PIDCOMP, PP05TIPO,'1',PIPREG,PIPREG,PUSUCRE,SYSDATE,PUSUCRE,SYSDATE);
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;     

END SP_INSERTAR_COMPONENTETIPO;

PROCEDURE SP_INSERTAR_COMPONENTESUBTIPO 
(PP06SUBTIPO IN NUMBER,PUSUCRE IN VARCHAR2,PIPREG IN VARCHAR2,PIDCOMP IN NUMBER)
AS
BEGIN
  INSERT INTO heco_componentesubtipo (P06SUBTIPO,IDCOMPONENTE,ESTADO,IPREG,IPMOD,USUCRE,FECCRE,USUMOD,FECMOD) 
VALUES (PP06SUBTIPO, PIDCOMP,'1',PIPREG,PIPREG,PUSUCRE,SYSDATE,PUSUCRE,SYSDATE);
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;     

END SP_INSERTAR_COMPONENTESUBTIPO;


---- extrae los componentes(items) asociadas a un tipo,subtipo y clase ----
PROCEDURE SP_LISTAR_COMPONENTES (
  pIdTipo  IN NUMBER,
  pIdSubTipo  IN NUMBER,
  pIdClase  IN NUMBER,
  oListado OUT TIPOCURSOR
)IS 
BEGIN
OPEN oListado FOR
    SELECT  cp.*,FNC_DESC_PARAMETRO(cp.p07clase) as p07claseDesc,FNC_DESC_PARAMETRO(cp.p01unidad) as p01unidadDesc  ,
    NVL((SELECT MIN(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=cp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMINIMO,
  NVL((SELECT MAX(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=cp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMAXIMO
    FROM heco_componente cp
    left join heco_componentetipo ct on ct.idcomponente = cp.idcomponente
    left join heco_componentesubtipo cst  on cst.idcomponente=cp.idcomponente
    where ct.p05tipo=pIdTipo  and (cst.p06subtipo=pIdSubTipo or pIdSubTipo=0) and cp.p07clase=pIdClase and cp.ESTADO = 1;
END SP_LISTAR_COMPONENTES;

PROCEDURE SP_CALCULAR_PRECIOSOTROS (PidProyecto IN INTEGER,oListado OUT TIPOCURSOR) AS
BEGIN
     OPEN oListado FOR
      select sum(preciototalminimo) as preciototalminimo, sum(preciototalmaximo) as preciototalmaximo
      from 
      ( SELECT gd.preciototalminimo, gd.preciototalmaximo FROM HECO_GRUPODETALLE gd     
     inner join heco_proyectogrupo pg on pg.idgrupo = gd.idgrupo
     inner join heco_componente comp on gd.idcomponente = comp.idcomponente
      WHERE gd.ESTADO = '1'  and comp.P07CLASE<>91 and pg.idProyecto = PidProyecto);
      
END SP_CALCULAR_PRECIOSOTROS;

PROCEDURE SP_ELIMINAR_PROYECTO (PIDPROYECTO IN INTEGER,PUSUARIOMOD IN VARCHAR2,PIPMOD IN VARCHAR2) AS
BEGIN
 update heco_proyecto set estado = 0,usumod = PUSUARIOMOD,ipmod = PIPMOD, fecmod = sysdate where idproyecto = PIDPROYECTO;
END SP_ELIMINAR_PROYECTO;

PROCEDURE SP_OBTENER_COMPONENTE ( pIDComponente  IN NUMBER,oListado OUT TIPOCURSOR)
 IS 
BEGIN
     OPEN oListado FOR
     SELECT comp.*,(SELECT max(preciounitario) FROM heco_componenteprecio  where idcomponente = compprecio.idcomponente) as preciomaximo
     ,FNC_DESC_PARAMETRO(comp.p07clase) as p07claseDesc,
    NVL((SELECT MIN(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=comp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMINIMO,
  NVL((SELECT MAX(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=comp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMAXIMO
      FROM heco_componente comp
      inner join heco_componenteprecio compprecio on compprecio.idcomponente = comp.idcomponente
      where comp.idcomponente = pIDComponente;
END SP_OBTENER_COMPONENTE;

PROCEDURE SP_OBTENER_COMP_RADIOENLACE (oListado OUT TIPOCURSOR)
 IS 
BEGIN
     OPEN oListado FOR
   SELECT Distinct(comp.idcomponente),comp.Nombre,comp.DESCRIPCION,comp.p07clase,(SELECT max(preciounitario) FROM heco_componenteprecio  where idcomponente = compprecio.idcomponente) as preciomaximo
     ,FNC_DESC_PARAMETRO(comp.p07clase) as p07claseDesc,
    NVL((SELECT MIN(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=comp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMINIMO,
  NVL((SELECT MAX(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=comp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMAXIMO
      FROM heco_componente comp
      inner join heco_componenteprecio compprecio on compprecio.idcomponente = comp.idcomponente
      where comp.idcomponente IN (197,201,200,58,97,102,104,152,224,285,287,288,231,234,235,238);
END SP_OBTENER_COMP_RADIOENLACE;
---- extrae todos los componentes(items) ----
PROCEDURE SP_LISTAR_TODOS_COMPONENTES ( oListado OUT TIPOCURSOR)
IS 
BEGIN
    OPEN oListado FOR
     SELECT  cp.idcomponente,cp.descripcion,cp.p01unidad,cp.p07clase,NVL(cp.tiempovidaanio,0) as tiempovidaanio,FNC_DESC_PARAMETRO(cp.p07clase) as p07claseDesc,FNC_DESC_PARAMETRO(cp.p01unidad) as p01unidadDesc,
    NVL((SELECT MIN(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=cp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMINIMO,
     NVL((SELECT MAX(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=cp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMAXIMO,
      cp.feccre, cp.CAPACIDAD,cp.INFOPUBLICA
    FROM heco_componente cp;
END SP_LISTAR_TODOS_COMPONENTES;

-- Componente Precio --


-- Componente Precio --
---- extrae los precios de un componente(item)  ----
PROCEDURE SP_LISTAR_PRECIO_COMP ( pIdComponente  IN NUMBER, oListado OUT TIPOCURSOR)
IS 
BEGIN
    OPEN oListado FOR
      select cp.*,FNC_DESC_PARAMETRO(cp.p02fuente) as p02fuenteDesc from heco_componenteprecio cp where cp.idcomponente = pIdComponente and cp.estado = '1';
END SP_LISTAR_PRECIO_COMP;

--Proyecto
PROCEDURE SP_LISTAR_PROYECTO_PAGINADO (pagina IN INTEGER, tamanio IN INTEGER, oListado OUT TIPOCURSOR) IS
BEGIN
     OPEN oListado FOR
   SELECT * FROM
  (
    SELECT a.*, rownum r
    FROM
    (
      SELECT c.*,FNC_DESC_PARAMETRO(c.p03tipoproyecto) as p03tipoproyectoDesc FROM HECO_PROYECTO c
      WHERE c.estado = 1 
      ORDER BY c.IDPROYECTO ASC
    ) a
    WHERE rownum < ((pagina * tamanio) + 1 )
  )
  WHERE r >= (((pagina-1) * tamanio) + 1);
END SP_LISTAR_PROYECTO_PAGINADO;



PROCEDURE SP_INSERTAR_PROYECTO ( PNOMBRE IN VARCHAR2, PDESCRIPCION IN VARCHAR2, PTIPOPROYECTO IN NUMBER,PUSUARIO IN VARCHAR2,PIDPROY OUT NUMBER)
AS
id NUMBER;
BEGIN

 SELECT SEQ_HECO_PROYECTO.NEXTVAL
    INTO id
    FROM DUAL;
    
   INSERT INTO HECO_PROYECTO (IDPROYECTO, NOMBRE, DESCRIPCION, P03TIPOPROYECTO,ESTADO,FECCRE,FECMOD,USUCRE,USUMOD,IPREG,IPMOD ) VALUES 
   (id, PNOMBRE, PDESCRIPCION, PTIPOPROYECTO,'1',SYSDATE,SYSDATE,PUSUARIO,PUSUARIO,'','');

PIDPROY := id;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      PIDPROY := -1;      

END SP_INSERTAR_PROYECTO;



PROCEDURE SP_MODIFICAR_PROYECTO ( PIDPROYECTO IN NUMBER,PNOMBRE IN VARCHAR2, PDESCRIPCION IN VARCHAR2, PTIPOPROYECTO IN NUMBER, PUSUARIO IN VARCHAR2, Pid OUT NUMBER)
AS

BEGIN

SELECT PIDPROYECTO INTO Pid FROM DUAL;
UPDATE HECO_PROYECTO
SET NOMBRE = PNOMBRE , DESCRIPCION = PDESCRIPCION, P03TIPOPROYECTO = PTIPOPROYECTO , USUMOD=PUSUARIO, FECMOD=SYSDATE
WHERE IDPROYECTO=  PIDPROYECTO;
COMMIT;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      Pid := -1;      

END SP_MODIFICAR_PROYECTO;

PROCEDURE SP_OBTENER_PROYECTO (pIdProyecto  IN NUMBER,  oListado OUT TIPOCURSOR) 
IS 
BEGIN
     OPEN oListado FOR
     select p.*,FNC_DESC_PARAMETRO(p.p03tipoproyecto) as p03tipoproyectoDesc from heco_proyecto p where idproyecto = pIdProyecto;
END SP_OBTENER_PROYECTO;


-- UTIL --
---- extrae las clases asociadas a un tipo y subtipo ----
PROCEDURE SP_LISTAR_CLASE_TIPOSUBTIPO (
  pIdTipo  IN NUMBER,
  pIdSubTipo  IN NUMBER,
  oListado OUT TIPOCURSOR
) IS
BEGIN
     OPEN oListado FOR
   SELECT  Distinct(cp.p07clase) as IDPARAMETRO,FNC_DESC_PARAMETRO(cp.p07clase) as nombre FROM heco_componente cp
  left join heco_componentetipo ct on ct.idcomponente = cp.idcomponente
  left join heco_componentesubtipo cst  on cst.idcomponente=cp.idcomponente
  where ct.p05tipo=pIdTipo  and (cst.p06subtipo=pIdSubTipo OR pIdSubTipo=0) and cp.ESTADO = 1;

END SP_LISTAR_CLASE_TIPOSUBTIPO;

------------------------------ GRUPO ------------------------------------------------------------------------
PROCEDURE SP_INSERTAR_GRUPO ( PNOMBRE IN VARCHAR2, PDESCRIPCION IN VARCHAR2,PCODIGO IN HECO_GRUPO.CODIGO%TYPE, PP05TIPO IN NUMBER,PP06SUBTIPO IN NUMBER,PUSUCRE IN VARCHAR2,PIDGRUPO OUT NUMBER)
AS
id NUMBER;
BEGIN

 SELECT SEQ_HECO_GRUPO.NEXTVAL
    INTO id
    FROM DUAL;
    
   INSERT INTO HECO_GRUPO (IDGRUPO,NOMBRE,DESCRIPCION,CODIGO,P05TIPO,P06SUBTIPO,ESTADO,FECCRE,FECMOD,USUCRE,USUMOD,IPREG,IPMOD) VALUES 
                              (id, PNOMBRE, PDESCRIPCION,PCODIGO,PP05TIPO,PP06SUBTIPO,'1',SYSDATE,SYSDATE,PUSUCRE,PUSUCRE,'','');
               
PIDGRUPO:= id;
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      PIDGRUPO := -1;      

END SP_INSERTAR_GRUPO;

PROCEDURE SP_ELIMINAR_GRUPO (PIDPROYECTO IN INTEGER,PIDGRUPO IN INTEGER,PUSUARIOMOD IN VARCHAR2,PIPMOD IN VARCHAR2)
 AS
BEGIN
 update heco_proyectogrupo set estado = 0,usumod = PUSUARIOMOD,ipmod = PIPMOD, fecmod = sysdate where idgrupo = PIDGRUPO;
 update heco_grupo set estado = 0,usumod = PUSUARIOMOD,ipmod = PIPMOD, fecmod = sysdate where idgrupo = PIDGRUPO;
 update heco_grupodetalle set estado = 0,usumod = PUSUARIOMOD,ipmod = PIPMOD, fecmod = sysdate where idgrupo = PIDGRUPO;
 -- actualizamos el prouecto ya que se hizo un cambio --
 update heco_proyecto set usumod = PUSUARIOMOD,ipmod = PIPMOD, fecmod = sysdate where idproyecto = PIDPROYECTO;
END SP_ELIMINAR_GRUPO;

------------------------------ GRUPODETALLE ------------------------------------------------------------------------
PROCEDURE SP_INSERTAR_GRUPO_DETALLE ( PIDCOMPONENTE IN NUMBER,PIDGRUPO IN NUMBER,PCANTIDAD IN NUMBER, 
PPRECIOTOTALMAXIMO IN NUMBER,PPRECIOTOTALMINIMO IN NUMBER, PUSUCRE IN VARCHAR2 ,PIDGRUPODETALLE OUT NUMBER)
AS
ID NUMBER;
BEGIN

 SELECT SEQ_HECO_GRUPODETALLE.NEXTVAL
    INTO id
    FROM DUAL;
    
   INSERT INTO HECO_GRUPODETALLE (IDGRUPODETALLE,IDCOMPONENTE,IDGRUPO,CANTIDAD,PRECIOTOTALMAXIMO,PRECIOTOTALMINIMO,ESTADO,FECCRE,FECMOD,USUCRE,USUMOD,IPREG,IPMOD) VALUES 
   (id, PIDCOMPONENTE, PIDGRUPO,PCANTIDAD,PPRECIOTOTALMAXIMO,PPRECIOTOTALMINIMO,'1',SYSDATE,SYSDATE,PUSUCRE,PUSUCRE,'','');

PIDGRUPODETALLE := id;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      PIDGRUPODETALLE := -1;      

END SP_INSERTAR_GRUPO_DETALLE;
------------------------------ PROYECTOGRUPO ------------------------------------------------------------------------
PROCEDURE SP_INSERTAR_PROYECTO_GRUPO ( PP04TITULO IN NUMBER,PIDGRUPO IN NUMBER,PIDPROYECTO IN NUMBER,PUSUCRE IN VARCHAR2,PIDPROYECTOGRUPO OUT NUMBER)
AS
Pid NUMBER;
BEGIN

 SELECT SEQ_HECO_PROYECTOGRUPO.NEXTVAL
    INTO Pid
    FROM DUAL;
    
   INSERT INTO HECO_PROYECTOGRUPO (IDPROYECTOGRUPO,P04TITULO,IDGRUPO,IDPROYECTO,ESTADO,FECCRE,FECMOD,USUCRE,USUMOD,IPREG,IPMOD) VALUES 
                              (Pid, PP04TITULO,PIDGRUPO,PIDPROYECTO,'1',SYSDATE,SYSDATE,PUSUCRE,PUSUCRE,'','');

PIDPROYECTOGRUPO := Pid;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      PIDPROYECTOGRUPO := -1;      

END SP_INSERTAR_PROYECTO_GRUPO;

PROCEDURE SP_OBTENER_GRUPO (pIdProyecto IN NUMBER,oListado OUT TIPOCURSOR) IS
BEGIN
     OPEN oListado FOR
     SELECT p.* ,FNC_DESC_PARAMETRO(p.p05tipo) as p05tipoDesc,FNC_DESC_PARAMETRO(p.p06subtipo) as p06subtipoDesc FROM HECO_GRUPO p
      inner join heco_proyectogrupo pg on pg.idgrupo = p.idgrupo
      WHERE P.ESTADO = '1' and pg.idproyecto = pIdProyecto order by p.p05tipo;

END SP_OBTENER_GRUPO;

PROCEDURE SP_OBTENER_GRUPODETALLE (PidGrupo IN INTEGER,oListado OUT TIPOCURSOR) AS
BEGIN
     OPEN oListado FOR
     SELECT GP.*,comp.descripcion as idcomponenteDesc,FNC_DESC_PARAMETRO(comp.p01unidad) as p01unidadDesc
     ,comp.p07clase,FNC_DESC_PARAMETRO(comp.p07clase) as p07claseDesc,
     NVL((SELECT MIN(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=comp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMINIMO,
     NVL((SELECT MAX(PRECIOUNITARIO) FROM HECO_COMPONENTEPRECIO X1 WHERE X1.IDCOMPONENTE=comp.IDCOMPONENTE AND X1.ESTADO=1),0) AS PRECIOMAXIMO
     FROM HECO_GRUPODETALLE GP
     inner join heco_componente comp on comp.idcomponente = gp.idcomponente
      WHERE GP.ESTADO = '1' and gp.idgrupo = PidGrupo;

END SP_OBTENER_GRUPODETALLE;
--PRECIO--
PROCEDURE SP_INSERTAR_COMPONENTEPRECIO 
(PPRECIOUNITARIO IN NUMBER, PP02FUENTE IN NUMBER, PNOMBREFUENTE IN VARCHAR, PIDCOMPONENTE IN NUMBER,PUSUCRE IN VARCHAR2,PIPREG IN VARCHAR2,PIDCOMPPRECIO OUT NUMBER )
AS
id NUMBER;
BEGIN
 SELECT SEQ_HECO_COMPONENTEPRECIO.NEXTVAL
    INTO id
    FROM DUAL;
    
INSERT INTO HECO_COMPONENTEPRECIO
 ( IDCOMPPRECIO, PRECIOUNITARIO, P02FUENTE, NOMBREFUENTE,IDCOMPONENTE, ESTADO,FECCRE,FECMOD,USUCRE,USUMOD,IPREG,IPMOD) 
 VALUES (id, PPRECIOUNITARIO, PP02FUENTE, PNOMBREFUENTE, PIDCOMPONENTE,'1',SYSDATE,SYSDATE,PUSUCRE,PUSUCRE,PIPREG,PIPREG);
 
 update HECO_COMPONENTE set usumod = PUSUCRE,ipmod = IPREG, fecmod = sysdate where idcomponente = PIDCOMPONENTE;

PIDCOMPPRECIO := id;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      PIDCOMPPRECIO := -1;      

END SP_INSERTAR_COMPONENTEPRECIO;

PROCEDURE SP_OBTENER_CANT_COMPACCESO(pIdProyecto IN NUMBER,pcantidad OUT NUMBER) IS
BEGIN 
select cantidad into pcantidad from (SELECT count(*) as cantidad FROM heco_grupodetalle gd
left join heco_proyectogrupo pg on pg.idgrupo = gd.idgrupo
left join heco_componentetipo ct on ct.idcomponente = gd.idcomponente
where ct.p05tipo = 12 and  pg.idproyecto = pIdProyecto); 

END SP_OBTENER_CANT_COMPACCESO;

END PKG_HECO_GLOBAL;